import { Module, Global, DynamicModule } from '@nestjs/common';
import { LoggerService } from './logger.service';
import { LoggerFactory, type ILoggerConfig } from './logger.factory';

/**
 * Logger 模块选项
 */
export interface LoggerModuleOptions {
  /** 日志配置 */
  config?: Partial<ILoggerConfig>;
}

/**
 * Logger 模块
 * 
 * 提供基于 Pino 的日志服务，支持：
 * - 静态工厂方法（LoggerFactory.get）
 * - 依赖注入（LoggerService）
 * - 按业务模块分离日志目录
 * - 自动日志滚动（按天 + 大小限制）
 * 
 * @example
 * ```ts
 * // 1. 在 AppModule 中导入（使用默认配置）
 * @Module({
 *   imports: [LoggerModule],
 * })
 * export class AppModule {}
 * 
 * // 2. 使用自定义配置
 * @Module({
 *   imports: [
 *     LoggerModule.forRoot({
 *       config: {
 *         logDir: '/var/log/myapp',
 *         level: 'info',
 *         maxSize: '50M',
 *         frequency: 'hourly',
 *       },
 *     }),
 *   ],
 * })
 * export class AppModule {}
 * 
 * // 3. 在 Service 中使用
 * @Injectable()
 * export class UserService {
 *   constructor(private readonly logger: LoggerService) {
 *     this.logger.setModule('user');
 *     this.logger.setContext('UserService');
 *   }
 * 
 *   async createUser() {
 *     this.logger.info('创建用户');
 *   }
 * }
 * 
 * // 4. 使用静态工厂方法
 * const logger = LoggerFactory.get('UserService', 'user');
 * logger.info('用户服务启动');
 * ```
 */
@Global()
@Module({
  providers: [LoggerService],
  exports: [LoggerService],
})
export class LoggerModule {
  /**
   * 使用自定义配置创建模块
   * 
   * @param options 模块选项
   * @returns 动态模块
   */
  static forRoot(options?: LoggerModuleOptions): DynamicModule {
    // 如果提供了配置，应用到 LoggerFactory
    if (options?.config) {
      LoggerFactory.configure(options.config);
    }

    return {
      module: LoggerModule,
      global: true,
      providers: [LoggerService],
      exports: [LoggerService],
    };
  }
}

